<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>验证哥德巴赫猜想</title>
    <script>
      //验证哥德巴赫猜想: 一个大于2的偶数可以拆分成两个质数之和。
      //穷举法验证
      function verifyGC(range = 100000) {
        /*1,寻找给定范围内的所有偶数；
         *2，寻找给定范围内的所有质数；
         *3，遍历所有偶数，寻找给定范围内不能拆分为两个质数之和的偶数；
         *4，若没有结果，则在给定范围内，哥德巴赫猜想成立；
         */

        var evenNumArr = []; //给定范围内的所有偶数
        var primeNumArr = []; //给定范围内的所有质数
        var i = 2;
        while (i <= range) {
          //步骤一：
          //寻找大于2的偶数
          if (i % 2 === 0 && i > 2) {
            evenNumArr.push(i);
          }
          //步骤二：
          //质数
          //根据质数特有性质：所有大于10的质数中，个位数只有1,3,7,9。
          if (i <= 10) {
            if (isPrime(i)) {
              primeNumArr.push(i);
            }
          } else {
            if ([1, 3, 7, 9].includes(i % 10)) {
              if (isPrime(i)) {
                primeNumArr.push(i);
              }
            }
          }
          i++;
        }
        console.log("大于2的偶数数组：", evenNumArr);
        console.log("质数数组：", primeNumArr);
        //步骤三：
        for (var item of evenNumArr) {
          //偶数可由两个质数相加，返回true, 否则返回false
          var result = primeNumArr.some((m) => primeNumArr.includes(item - m));
          //某个偶数不能由两个质数相加
          if (result === false) {
            console.log("该偶数不能由两个质数相加：", item, ", 哥德巴赫猜想在2~", range, "内不成立");
            return;
          }
        }
        //步骤四：
        console.log("哥德巴赫猜想在2~", range, "内成立");
      }
      function isPrime(num) {
        //质数约数只有 1 和其本身， 有其他约数可直接判定非质数
        for (var i = 1; i < num; i++) {
          if (num % i === 0) {
            if (i > 1 && i < num) {
              //不是质数，返回false
              return false;
            }
          }
        }
        //是质数，返回true
        return true;
      }
      verifyGC();
    </script>
  </head>
  <body></body>
</html>
